package com.bjpowernode.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

/**
 * jwt工具类
 */
@Component
public class JwtUtil {

    @Value(value = "${jwt.secret}")
    private String secret;

    /**
     * 生成jwt
     * @param userJson
     * @return
     */
    public String generateJwt(String userJson) {
        Map<String, Object> header = new HashMap<>();
        header.put("alg", "HS256");
        header.put("typ", "JWT");
        return JWT.create()
                // 头
                .withHeader(header)
                // 负载数据
                .withClaim("user", userJson)
                // 签名
                .sign(Algorithm.HMAC256(secret));
    }

    /**
     * 验证jwt
     * @param jwt
     * @return
     */
    public Boolean verifyJwt(String jwt) {
        // 创建一个jwt的验证器对象
        try {
            JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(secret))
                    .build();
            // 验证jwt , 如果抛出异常 即未通过验证 , 否则验证通过
            jwtVerifier.verify(jwt);
            return true;
        } catch (Exception e) {
            // 错误 , 验证未通过
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 解析token
     * @param token
     * @return
     */
    public String parseToken(String token) {
        // 创建一个解析对象
        try {
            JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(secret)).build();
            // 验证jwt
            DecodedJWT decodedJWT = jwtVerifier.verify(token);
            // 获取jwt中的负载数据
            Claim user = decodedJWT.getClaim("user");
            return user.asString();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

}
